//
// Created by hsj on 2024-1-10.
// select demo stdin的输入
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>

#ifdef WIN32
//windows minGW64
//inet_pton函数：_WIN32_WINNT
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <winsock2.h>
#include <ws2tcpip.h>
//#pragma comment(lib,"ws2_32.lib")
#else
//linux  gcc
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#endif
#define BUF_SIZE 40
int main(int argc, char* argv[]){
    /**
     *  最大值：32*8*8 = 2048
     *  最小值：32*4*8 = 1024
        typedef struct{
            long int fds_bits[32];
        }fd_set;
     */
    fd_set reads, temps;
    int result, str_len;
    char buf[BUF_SIZE];
    struct timeval timeout;

    FD_ZERO(&reads);//重置初始化0
    FD_SET(0,&reads); // 0 is standard input(console):stdin 注册文件描述符0:stdin

     /*
          struct timeval{
            long tv_sec;//seconds
            long tv_usec;//microseconds
           };
     */

    /*
           timeout.tv_sec=5;//5 sec
           timeout.tv_usec=5000; //5 sec
     */

    while(1){
        temps=reads;//每次重新初始化read事件
        timeout.tv_sec=5;
        timeout.tv_usec=0;
        result=select(0 + 1, &temps, 0, 0, &timeout);//第一个参数加+1，下标从0开始【代表遍历的数量上限】...

        if(result==-1){
            puts("select() error!");
            break;
        }
        else if(result==0){//超时返回，一个也没有
            puts("Time-out!");
        }
        else if(FD_ISSET(0, &temps)){//FD_ISSET(int fd, fd_set * fdset) :若参数fdset指向的变量中包含文件描述符fd的信息，则返回“真”。
            str_len=read(0, buf, BUF_SIZE - 1);
            buf[str_len]=0;
            printf("message from console: %s", buf);
        }
    }

    return EXIT_SUCCESS;
}

